www.gusucode.com > 用于人脸识别和人脸定位的主动形状模型(asm)matlab工具箱 > asm toolbox\AlignTrnSetCoor.m

    %%%%%%%%%%%%%%%%%%%%%%%%%%
%(c) Ghassan Hamarneh 1999
%%%%%%%%%%%%%%%%%%%%%%%%%%
function Xa=AlignTrnSetCoor(Xu,W,ContoursEndingPoints);
%function Xa=AlignTrnSetCoor(Xu,W,ContoursEndingPoints);

MRG1=0.001;%scaling convergence
MRG2=.001*pi/180;%theta convergence
MRG3=0.01;%translation convergence

x1=Xu(1      :end/2,1);%x of 1st shape
y1=Xu(end/2+1:end  ,1);%y of 1st shape

%aligning 2nd-last to the first shape
hwtbar = waitbar(0,'Aligning shapes to first shape. Please wait...');
Xa1=[Xu(:,1)];
for ind1=2:size(Xu,2),
   %align shape-ind1 to shape-1
   waitbar(ind1/size(Xu,2));
   xi=Xu(1      :end/2,ind1);
   yi=Xu(end/2+1:end  ,ind1);
   [xiNew,yiNew]=AlignShapeToShape(x1,y1,xi,yi,W);
   Xa1=[Xa1,[xiNew;yiNew]];
end
close(hwtbar);

NumCnvrg=0;
while NumCnvrg<size(Xu,2) %not all shapes converged
%for ind1=1:NumAlignLoops,%while (no convergence),  
   %finding the mean shape
   MeanXa1=(sum(Xa1'))'/size(Xa1,2);
   
   %NORMALIZING the mean can be done in one of two ways...
   
   %...1. normalize the mean by aligning it to the first shape
   [xmNew,ymNew]=AlignShapeToShape(Xu(1:end/2,1),Xu(end/2+1:size(Xu,1),1),...
     MeanXa1(1:end/2),MeanXa1(end/2+1:end),W);
   
   %...2. normalize the mean by scaling rotating and translating
   %[xmNew,ymNew]=NormalizeShape(MeanXa1(1:end/2),MeanXa1(end/2+1:end));  
   
   Xa=[];
   NumCnvrg=0;
   for ind2=1:size(Xu,2),
      %align shape-ind2 to normalized meanshape
      xi=Xa1(1      :end/2 ,ind2);
      yi=Xa1(end/2+1:end   ,ind2);
      [xiNew,yiNew,s,Theta,tx,ty]=AlignShapeToShape(xmNew,ymNew,xi,yi,W);
      %checking for convergence
      if(abs(s-1)<MRG1 & abs(Theta)<0+MRG2 & abs(tx)<0+MRG3 & abs(ty)<0+MRG3)
         NumCnvrg=NumCnvrg+1;
      end            
      Xa=[Xa,[xiNew;yiNew]];      
   end      
   Xa1=Xa;
end